package com.itlong.cloud.app.dao;

import com.itlong.cloud.POJO.PO.DevicePadInfoPO;
import com.itlong.cloud.POJO.VO.app.*;
import com.itlong.cloud.POJO.VO.operate.OperateUpdateDetailVO;
import com.itlong.cloud.POJO.VO.property.CloudElevatorVO;
import com.itlong.cloud.POJO.VO.property.CloudIntercomChangeLogOrderVO;
import com.itlong.cloud.POJO.VO.property.PadFaceUserInfoNewVO;
import com.itlong.cloud.POJO.VO.property.PadFaceUserInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      平板人脸数据操作接口。
 * <desc/>
 *
 * @createDate 2018-05-14.
 */
@Mapper
@Repository
public interface IAppPadFaceDao {

    /**
     * <desc>
     *      判断项目是否禁用。
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2018-06-13
     */
    Integer checkProjectForbidden(@Param("projectId") String projectId);

    /**
     * <desc>
     *      设备验证(梯控)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @param elevatorType 电梯类型
     * @param isFaceRecognition 是否支持人脸识别
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    String elevatorAuthorityCheck(@Param("projectId") String projectId, @Param("deviceId") String deviceId,
                                  @Param("elevatorType") String elevatorType, @Param("isFaceRecognition") String isFaceRecognition);

    /**
     * <desc>
     *      设备验证(群控器)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    String controllerAuthorityCheck(@Param("projectId") String projectId, @Param("deviceId") String deviceId);

    /**
     * <desc>
     *      设备验证(门禁)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @param isFaceRecognition 是否支持人脸识别
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    String entranceAuthorityCheck(@Param("projectId") String projectId, @Param("deviceId") String deviceId, @Param("isFaceRecognition") String isFaceRecognition);

    /**
     * <desc>
     *      登陆验证。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param userName 账号
     * @param password 密码
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    Integer engineerLoginVerify(@Param("projectId") String projectId, @Param("userName") String userName, @Param("password") String password);

    /**
     * <desc>
     *      登陆项目验证。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param userName 账号
     * @return
     * @author Qiang.S
     * @createDate 2018-06-08
     */
    Integer engineerLoginProjectVerify(@Param("projectId") String projectId, @Param("userName") String userName);

    /**
     * <desc>
     *      工程人员帐号是否存在验证。
     * <desc/>
     *
     * @param userName 账号
     * @return
     * @author Qiang.S
     * @createDate 2018-06-11
     */
    Integer engineerLoginExistsVerify(@Param("userName") String userName);

    /**
     * <desc>
     *      平板获取广告(梯控)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    List<AppPadADVO> getElevatorAD(@Param("projectId") String projectId, @Param("deviceId") String deviceId);

    /**
     * <desc>
     *      平板获取广告(门禁)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @return
     * @author Qiang.S
     * @createDate 2018-05-14
     */
    List<AppPadADVO> getEntranceAD(@Param("projectId") String projectId, @Param("deviceId") String deviceId);

    /**
     * <desc>
     *      通过projectId和deviceId获取deviceUnique(梯控)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @return
     * @author Qiang.S
     * @createDate 2018-05-16
     */
    AppPadDeviceVO getElevatorDeviceUnique(@Param("projectId") String projectId, @Param("deviceId") String deviceId);

    /**
     * <desc>
     *      通过projectId和deviceId获取deviceUnique(门禁)。
     * <desc/>
     *
     * @param projectId 项目编号
     * @param deviceId 项目ID
     * @return
     * @author Qiang.S
     * @createDate 2018-05-16
     */
    AppPadDeviceVO getEntranceDeviceUnique(@Param("projectId") String projectId, @Param("deviceId") String deviceId);


    /**
     * <desc>
     *      获取用户账户金额。
     * <desc/>
     *
     * @param userId 用户编号
     * @return
     * @author shengen.T
     * @createDate 2018-05-24
     */
    BigDecimal getUserAccountMoney(@Param("userId") String userId);

    /**
     * <desc>
     *     获取平板更新信息。
     * <desc/>
     *
     * @return
     * @author Qiang.S
     * @createDate 2018-05-31
     */
    AppPadProgramInfoVO getPadProgramInfo(@Param("type") String type);

    /**
     * <desc>
     *      判断当前平板设备唯一码的设备是否存在或是否被禁用。
     * <desc/>
     *
     * @param padDeviceUnique 设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019-01-18
     */
    String getPadDeviceExist(@Param("padDeviceUnique") String padDeviceUnique);

    /**
     * <desc>
     *      判断该emId是否已绑定过百度识别授权码
     * <desc/>
     *
     * @param baiduId emId
     * @return
     * @author Juguang.S
     * @createDate 2019-01-18
     */
    Map<String,Object> getIsBingBaiduCode(@Param("baiduId") String baiduId);

    /**
     * <desc>
     *      查询未绑定的百度识别授权码
     * <desc/>
     *
     * @return
     * @author Juguang.S
     * @createDate 2019-01-18
     */
    Map<String,Object> getBaiduCode(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      标准更新
     * </desc>
     * @param  params 更新信息
     * @return Integer
     * @author Juguang.S
     * @createDate 2019-01-18
     */
    Integer update(Map<String,Object> params);

    /**
     * <desc>
     *      更新绑定百度识别码的项目编号
     * <desc/>
     *
     * @param baiduId 百度ID
     * @param code 3激活成功4激活失败
     * @param msg 失败信息
     * @return
     * @author Juguang.S
     * @createDate 2019-01-26
     */
    Integer reportBaiDuAuthCode(@Param("baiduId") String baiduId,@Param("code") String code,@Param("msg") String msg);

    /**
     * <desc>
     *      更新绑定百度识别码的项目编号
     * <desc/>
     *
     * @param projectId 项目编号
     * @param baiduId baiduId
     * @return
     * @author Juguang.S
     * @createDate 2019-01-26
     */
    Integer updateProjectId(@Param("projectId") String projectId,@Param("baiduId") String baiduId,@Param("deviceUnique") String deviceUnique,@Param("useStatus") String useStatus);

    /**
     * <desc>
     *      根据deviceUnique查询该设备是否已绑定或已购买
     * <desc/>
     *
     * @param deviceUnique 设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019/03/12
     */
    Integer getDeviceBuyOrBingStatus(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      释放该机号与之前所绑定百度id激活码之间的关系
     * <desc/>
     *
     * @param deviceUnique 设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019/03/12
     */
    Integer updateOldDeviceBingInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取百度授权码是否充足
     * <desc/>
     *
     * @return
     * @author Juguang.S
     * @createDate 2019/03/13
     */
    Map<String,Object> isEnoughByBaiduCode();

    /**
     * <desc>
     *      校验该平板机号有没被其它设备占用
     * <desc/>
     *
     * @param baiduId 百度ID
     * @param padDeviceUnique 平板设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019-03-20
     */
    Integer isDeviceIdUserd(@Param("baiduId") String baiduId,@Param("padDeviceUnique") String padDeviceUnique);

    /**
     * <desc>
     *      根据人脸编号获取电梯信息。
     * <desc/>
     *
     * @param uId 百度人脸编号
     * @return
     * @author Qiang.S
     * @createDate 2019-02-27
     */
    List<AppPadVisitorElevatorInfoVO> getElevatorInfoByFaceId(String uId);

    /**
     * <desc>
     *      根据人脸编号获取门禁信息。
     * <desc/>
     *
     * @param uId 百度人脸编号
     * @return
     * @author Qiang.S
     * @createDate 2019-02-27
     */
    List<AppDoorDevicesVO> getDoorInfoByFaceId(String uId);

    /**
     * <desc>
     *      根据用账户名获取userId。
     * <desc/>
     *
     * @param userName 账号
     * @return
     * @author Juguang.S
     * @createDate 2019-03-18
     */
    String getUserIdByUserName(@Param("userName") String userName);

    /**
     * <desc>
     *      根据项目编号获取当前C#人脸识别同步时长。
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019-03-22
     */
    Integer getSystemDataTimeByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取项目的设备过期时间。
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019-08-06
     */
    List<Map<String, Object>> getDeviceCloudServiceCostEndTime(@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取物业的联系方式。
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019-08-15
     */
    String getPropertyPhone(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据平板编号查询平板iot信息。
     * <desc/>
     *
     * @param padDeviceUnique 平板编号
     * @return
     * @author Qiang.S
     * @createDate 2019-03-22
     */
    CloudElevatorVO getPadIotInfo(@Param("padDeviceUnique") String padDeviceUnique);

    /**
     * <desc>
     *      根据设备编号获取平板升级指令。
     * <desc/>
     *
     * @param deviceUnique 平板编号
     * @return
     * @author Qiang.S
     * @createDate 2019-12-16
     */
    List<CloudIntercomChangeLogOrderVO> getUpdateDeviceInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取安装包详细信息 设备更新用。
     * <desc/>
     *
     * @param updateId 更新文件编号
     * @param deviceType 软件类型 4 维护程序，5 业务程序，6 桌面程序，7 通信程序
     * @param productType 产品类型 5人脸识别仪
     * @return
     * @author Qiang.S
     * @createDate 2018/08/23
     */
    List<OperateUpdateDetailVO> getUpdateDetailForDeviceUpdate(@Param("updateId") String updateId,
                                                         @Param("deviceType") String deviceType,
                                                         @Param("productType") String productType);

    /**
     * <desc>
     *      批量完成轮询命令
     * <desc/>
     *
     * @param deviceUnique
     * @param ids 轮询命令id列表
     * @param syncStatus 状态，1.待同步；2.同步中;3.同步结束
     * @return
     * @author Qiang.S
     * @createDate 2019-12-16
     */
    Integer changeChangeLogOrdersStatus(@Param("deviceUnique") String deviceUnique,
                                        @Param("ids") String[] ids,
                                        @Param("syncStatus") Integer syncStatus);

    /**
     * <desc>
     *      根据deviceUnique批量获取电梯地址
     * </desc>
     *
     * @param deviceUniqueList deviceUnique集合
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/16
     */
    List<Map<String, Object>> getElevatorAddressList(@Param("deviceUniqueList") List<String> deviceUniqueList);

    /**
     * <desc>
     *      根据deviceUnique批量获取门禁地址
     * </desc>
     *
     * @param deviceUniqueList deviceUnique集合
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/16
     */
    List<Map<String, Object>> getEntranceAddressList(@Param("deviceUniqueList") List<String> deviceUniqueList);

    /**
     * <desc>
     *      根据deviceUnique批量获取云群控器地址
     * </desc>
     *
     * @param deviceUniqueList deviceUnique集合
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/16
     */
    List<Map<String, Object>> getCloudControllerAddressList(@Param("deviceUniqueList") List<String> deviceUniqueList);

    /**
     * <desc>
     *      批量删除设备地址信息
     * </desc>
     *
     * @param deviceUnique 平板设备唯一号
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/16
     */
    Integer batchDeleteDeviceBridgeInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      批量保存设备地址信息
     * </desc>
     *
     * @param batchSaveParams 批量保存参数
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/16
     */
    Integer batchSavePadBridgeInfo(List<Map<String, Object>> batchSaveParams);

    /**
     * <desc>
     *      更新平板信息
     * </desc>
     *
     * @param bindDeviceUnique
     * @param deviceUnique
     * @param mac
     * @return
     * @Author Zhu.yj
     * @createDate  2019/12/26
     */
    Integer updatePadInfo(@Param("bindDeviceUnique")String bindDeviceUnique,@Param("deviceUnique")String deviceUnique,@Param("mac")String mac);

    /**
     * <desc>
     *      获取平板绑定的电梯设备数量
     * </desc>
     *
     * @param bindDeviceList
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/2
     */
    Integer getBindElevatorCount(@Param("bindDeviceList") List<String> bindDeviceList);

    /**
     * <desc>
     *      获取平板绑定的门禁设备数量
     * </desc>
     *
     * @param bindDeviceList
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/2
     */
    Integer getBindEntranceCount(@Param("bindDeviceList") List<String> bindDeviceList);

    /**
     * <desc>
     *      获取普通门禁数量
     * </desc>
     *
     * @param entranceDeviceList
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/8
     */
    Integer getCommonEntranceCount(@Param("entranceDeviceList") List<String> entranceDeviceList);

    /**
     * <desc>
     *      获取绑定的云群控器数量
     * </desc>
     *
     * @param bindDeviceList 云群控器设备编号集合
     * @return
     * @Author Zhu.yj
     * @createDate  2020/1/9
     */
    Integer getCloudControllerCount(@Param("bindDeviceList") List<String> bindDeviceList);

    /**
     * <desc>
     *      根据普通门禁编号查询授权的用户信息
     * </desc>
     *
     * @param bindDeviceUnique 普通门禁编号
     * @return
     * @Author Qiang.S
     * @createDate  2020/02/20
     */
    List<PadFaceUserInfoNewVO> getUserInfoByRoleId(String bindDeviceUnique);

    /**
     * <desc>
     *     更新设备能力集信息
     * </desc>
     *
     * @param
     * @return
     * @Author pengwei
     * @createDate  2020/11/17
     */
    void  updateDeviceInfo(Map<String,String>  map);

    /**
     * <desc>
     *     更新特殊设备能力集信息
     * </desc>
     *
     * @param
     * @return
     * @Author pengwei
     * @createDate  2020/11/18
     */
    void  updateSpecialDeviceInfo(Map<String,String>  map);

    /**
     * <desc>
     *    获取产品类型代码
     * </desc>
     *
     * @param  deviceAttributes  产品型号值
     * @return  String           产品类型代码
     * @Author pengwei
     * @createDate  2020/11/17
     */
     String   getProductCode(@Param("deviceAttributes") String   deviceAttributes);

    /**
     * <desc>
     * 根据padDeviceUnique 获取pad信息
     * </desc>
     *
     * @param padDeviceUnique
     * @return
     * @author caoshuai
     * @createDate 2020/12/10 11:52
     */
    DevicePadInfoPO getDevicePadByDeviceUnique(@Param("deviceUnique")String deviceUnique);

    /**
     * <desc>
     * 保存
     * </desc>
     *
     * @param map
     * @return
     * @author caoshuai
     * @createDate 2020/12/10 11:52
     */
    Integer save (Map map);
}
